package com.zimin.common.utils;


import cn.hutool.crypto.digest.MD5;
import com.zimin.common.enums.Number;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;


/**
 * <p>Md5工具类  单向加密算法
 * 特点：加密速度快，不需要秘钥，但是安全性不高，需要搭配随机盐值使用</p>
 *
 * @since 2022-03-16 14:51:00
 */
public class Md5Util extends MD5 {

    /**
     * <p>加密</p>
     *
     * @param str 加密字符串
     * @return java.lang.String
     * @since 2022-03-16 14:51:18
     */
    public static String encrypt(String str) {
        return MD5.create().digestHex(str);
    }

    /**
     * 获取单个文件的MD5值！
     *
     * @param file
     * @return
     */
    public static String getFileMD5(MultipartFile file) {
        try {
            var uploadBytes = file.getBytes();
            var md5 = MessageDigest.getInstance("MD5");
            var digest = md5.digest(uploadBytes);
            return new BigInteger(Number.ONE.getIntNum(), digest).toString(16);
        } catch (Exception ignored) {
        }
        return null;
    }


    /**
     * <p>加密字符串</p>
     *
     * @param content 明文
     * @param salt    盐
     * @param charset 加载格式
     * @return java.lang.String
     * @since 2022-06-19 19:11:32
     */
    public static String sign(String content, String salt, String charset) {
        content = content + salt;
        return DigestUtils.md5Hex(getContentBytes(content, charset));
    }

    /**
     * <p>验证字符串</p>
     *
     * @param content 明文
     * @param sign 签名
     * @param salt 盐
     * @param charset 字符串格式
     * @return boolean
     * @since 2022-06-19 19:12:43
     */
    public static boolean verify(String content, String sign, String salt, String charset) {
        content = content + salt;
        var mysign = DigestUtils.md5Hex(getContentBytes(content, charset));
        return mysign.equals(sign);
    }

    private static byte[] getContentBytes(String content, String charset) {
        if (!"".equals(charset)) {
            try {
                return content.getBytes(charset);
            } catch (UnsupportedEncodingException var3) {
                throw new RuntimeException("MD5签名过程中出现错误,指定的编码集错误");
            }
        } else {
            return content.getBytes();
        }
    }


}
